package com.ziroom.crm.mq.core.processor.statistic;

import com.ziroom.crm.mq.core.config.MqConfig;
import com.ziroom.crm.mq.core.context.InvokeContext;
import com.ziroom.crm.mq.core.node.Node;
import com.ziroom.crm.mq.core.processor.*;
import com.ziroom.crm.mq.core.util.AssertUtil;

import java.util.Objects;

/**
 * <p></p>
 * <p>
 * <PRE>
 * <BR>    修改记录
 * <BR>-----------------------------------------------
 * <BR>    修改日期         修改人          修改内容
 * </PRE>
 *
 * @author WeiShaoying
 * @version 1.0
 * @date Created in 2020年09月01日 17:41
 * @since 1.0
 */
public class StatisticProcessor implements SendProcessor, ReSendProcessor, ConsumeProcessor, ReConsumeProcessor {

    @Override
    public void preReSend(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        // nothing
    }

    @Override
    public void postReSend(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        Node node = invokeContext.getNode();
        AssertUtil.notNull(node, "node 不允许为空");

        if (Objects.isNull(invokeContext.getMessage().getException())) {
            node.incReSendSuccess();
        } else {
            node.incReSendException();
        }
    }

    @Override
    public void preSend(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        // nothing
    }

    @Override
    public void postSend(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        if (MqConfig.getConfig(MqConfig.INNER_JOB_ENABLE).equals(Boolean.FALSE.toString())) {
            return;
        }

        Node node = invokeContext.getNode();
        AssertUtil.notNull(node, "node 不允许为空");

        if (Objects.isNull(invokeContext.getMessage().getException())) {
            node.incSendSuccess();
        } else {
            node.incSendException();
        }
    }

    @Override
    public void preConsume(InvokeContext invokeContext, QueueWrapper queueWrapper) {

    }

    @Override
    public void postConsume(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        if (MqConfig.getConfig(MqConfig.INNER_JOB_ENABLE).equals(Boolean.FALSE.toString())) {
            return;
        }
        Node node = invokeContext.getNode();
        AssertUtil.notNull(node, "node 不允许为空");

        if (Objects.isNull(invokeContext.getMessage().getException())) {
            node.incConsumeSuccess();
        } else {
            node.incConsumeException();
        }
    }

    @Override
    public void preReConsume(InvokeContext invokeContext, QueueWrapper queueWrapper) {

    }

    @Override
    public void postReConsume(InvokeContext invokeContext, QueueWrapper queueWrapper) {
        if (MqConfig.getConfig(MqConfig.INNER_JOB_ENABLE).equals(Boolean.FALSE.toString())) {
            return;
        }

        Node node = invokeContext.getNode();
        AssertUtil.notNull(node, "node不允许为空");

        if (Objects.isNull(invokeContext.getMessage().getException())) {
            node.incReConsumeSuccess();
        } else {
            node.incReConsumeException();
        }
    }

}
